From fc4c44d9681dce9ed5f4ebf92177d9221f51c0ce Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Fri, 23 Feb 2007 11:32:25 +0000 Subject: [PATCH] hvm: Clean up initialisation of hvm_funcs. Signed-off-by: Keir Fraser --- xen/arch/x86/hvm/hvm.c | 9 +++-- xen/arch/x86/hvm/svm/svm.c | 63 +++++++++++++---------------- xen/arch/x86/hvm/vmx/vmx.c | 67 ++++++++++++------------------- xen/include/asm-x86/hvm/hvm.h | 7 +--- xen/include/asm-x86/hvm/support.h | 2 +- 5 files changed, 61 insertions(+), 87 deletions(-) diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 57d58e7647..0d30ac7a11 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -49,18 +49,18 @@ #include #include -int hvm_enabled; +int hvm_enabled __read_mostly; -unsigned int opt_hvm_debug_level; +unsigned int opt_hvm_debug_level __read_mostly; integer_param("hvm_debug", opt_hvm_debug_level); -struct hvm_function_table hvm_funcs; +struct hvm_function_table hvm_funcs __read_mostly; /* I/O permission bitmap is globally shared by all HVM guests. */ char __attribute__ ((__section__ (".bss.page_aligned"))) hvm_io_bitmap[3*PAGE_SIZE]; -void hvm_enable(void) +void hvm_enable(struct hvm_function_table *fns) { if ( hvm_enabled ) return; @@ -72,6 +72,7 @@ void hvm_enable(void) memset(hvm_io_bitmap, ~0, sizeof(hvm_io_bitmap)); clear_bit(0x80, hvm_io_bitmap); + hvm_funcs = *fns; hvm_enabled = 1; } diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index e68c42fc30..441ad1c9a1 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -988,6 +988,32 @@ static int svm_event_injection_faulted(struct vcpu *v) return vmcb->exitintinfo.fields.v; } +static struct hvm_function_table svm_function_table = { + .disable = stop_svm, + .vcpu_initialise = svm_vcpu_initialise, + .vcpu_destroy = svm_vcpu_destroy, + .store_cpu_guest_regs = svm_store_cpu_guest_regs, + .load_cpu_guest_regs = svm_load_cpu_guest_regs, + .save_cpu_ctxt = svm_save_vmcb_ctxt, + .load_cpu_ctxt = svm_load_vmcb_ctxt, + .paging_enabled = svm_paging_enabled, + .long_mode_enabled = svm_long_mode_enabled, + .pae_enabled = svm_pae_enabled, + .guest_x86_mode = svm_guest_x86_mode, + .get_guest_ctrl_reg = svm_get_ctrl_reg, + .get_segment_base = svm_get_segment_base, + .get_segment_register = svm_get_segment_register, + .update_host_cr3 = svm_update_host_cr3, + .update_guest_cr3 = svm_update_guest_cr3, + .update_vtpr = svm_update_vtpr, + .stts = svm_stts, + .set_tsc_offset = svm_set_tsc_offset, + .inject_exception = svm_hvm_inject_exception, + .init_ap_context = svm_init_ap_context, + .init_hypercall_page = svm_init_hypercall_page, + .event_injection_faulted = svm_event_injection_faulted +}; + int start_svm(void) { u32 eax, ecx, edx; @@ -1031,42 +1057,7 @@ int start_svm(void) if (cpu == 0) setup_vmcb_dump(); - /* Setup HVM interfaces */ - hvm_funcs.disable = stop_svm; - - hvm_funcs.vcpu_initialise = svm_vcpu_initialise; - hvm_funcs.vcpu_destroy = svm_vcpu_destroy; - - hvm_funcs.store_cpu_guest_regs = svm_store_cpu_guest_regs; - hvm_funcs.load_cpu_guest_regs = svm_load_cpu_guest_regs; - - hvm_funcs.save_cpu_ctxt = svm_save_vmcb_ctxt; - hvm_funcs.load_cpu_ctxt = svm_load_vmcb_ctxt; - - hvm_funcs.paging_enabled = svm_paging_enabled; - hvm_funcs.long_mode_enabled = svm_long_mode_enabled; - hvm_funcs.pae_enabled = svm_pae_enabled; - hvm_funcs.guest_x86_mode = svm_guest_x86_mode; - hvm_funcs.get_guest_ctrl_reg = svm_get_ctrl_reg; - hvm_funcs.get_segment_base = svm_get_segment_base; - hvm_funcs.get_segment_register = svm_get_segment_register; - - hvm_funcs.update_host_cr3 = svm_update_host_cr3; - hvm_funcs.update_guest_cr3 = svm_update_guest_cr3; - - hvm_funcs.update_vtpr = svm_update_vtpr; - - hvm_funcs.stts = svm_stts; - hvm_funcs.set_tsc_offset = svm_set_tsc_offset; - - hvm_funcs.inject_exception = svm_hvm_inject_exception; - - hvm_funcs.init_ap_context = svm_init_ap_context; - hvm_funcs.init_hypercall_page = svm_init_hypercall_page; - - hvm_funcs.event_injection_faulted = svm_event_injection_faulted; - - hvm_enable(); + hvm_enable(&svm_function_table); return 1; } diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 3565fdee22..aabe5b789b 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -1000,44 +1000,31 @@ static int vmx_event_injection_faulted(struct vcpu *v) return (idtv_info_field & INTR_INFO_VALID_MASK); } -/* Setup HVM interfaces */ -static void vmx_setup_hvm_funcs(void) -{ - hvm_funcs.disable = stop_vmx; - - hvm_funcs.vcpu_initialise = vmx_vcpu_initialise; - hvm_funcs.vcpu_destroy = vmx_vcpu_destroy; - - hvm_funcs.store_cpu_guest_regs = vmx_store_cpu_guest_regs; - hvm_funcs.load_cpu_guest_regs = vmx_load_cpu_guest_regs; - - hvm_funcs.save_cpu_ctxt = vmx_save_vmcs_ctxt; - hvm_funcs.load_cpu_ctxt = vmx_load_vmcs_ctxt; - - hvm_funcs.paging_enabled = vmx_paging_enabled; - hvm_funcs.long_mode_enabled = vmx_long_mode_enabled; - hvm_funcs.pae_enabled = vmx_pae_enabled; - hvm_funcs.guest_x86_mode = vmx_guest_x86_mode; - hvm_funcs.get_guest_ctrl_reg = vmx_get_ctrl_reg; - hvm_funcs.get_segment_base = vmx_get_segment_base; - hvm_funcs.get_segment_register = vmx_get_segment_register; - - hvm_funcs.update_host_cr3 = vmx_update_host_cr3; - hvm_funcs.update_guest_cr3 = vmx_update_guest_cr3; - - hvm_funcs.update_vtpr = vmx_update_vtpr; - - hvm_funcs.stts = vmx_stts; - hvm_funcs.set_tsc_offset = vmx_set_tsc_offset; - - hvm_funcs.inject_exception = vmx_inject_exception; - - hvm_funcs.init_ap_context = vmx_init_ap_context; - - hvm_funcs.init_hypercall_page = vmx_init_hypercall_page; - - hvm_funcs.event_injection_faulted = vmx_event_injection_faulted; -} +static struct hvm_function_table vmx_function_table = { + .disable = stop_vmx, + .vcpu_initialise = vmx_vcpu_initialise, + .vcpu_destroy = vmx_vcpu_destroy, + .store_cpu_guest_regs = vmx_store_cpu_guest_regs, + .load_cpu_guest_regs = vmx_load_cpu_guest_regs, + .save_cpu_ctxt = vmx_save_vmcs_ctxt, + .load_cpu_ctxt = vmx_load_vmcs_ctxt, + .paging_enabled = vmx_paging_enabled, + .long_mode_enabled = vmx_long_mode_enabled, + .pae_enabled = vmx_pae_enabled, + .guest_x86_mode = vmx_guest_x86_mode, + .get_guest_ctrl_reg = vmx_get_ctrl_reg, + .get_segment_base = vmx_get_segment_base, + .get_segment_register = vmx_get_segment_register, + .update_host_cr3 = vmx_update_host_cr3, + .update_guest_cr3 = vmx_update_guest_cr3, + .update_vtpr = vmx_update_vtpr, + .stts = vmx_stts, + .set_tsc_offset = vmx_set_tsc_offset, + .inject_exception = vmx_inject_exception, + .init_ap_context = vmx_init_ap_context, + .init_hypercall_page = vmx_init_hypercall_page, + .event_injection_faulted = vmx_event_injection_faulted +}; int start_vmx(void) { @@ -1095,9 +1082,7 @@ int start_vmx(void) vmx_save_host_msrs(); - vmx_setup_hvm_funcs(); - - hvm_enable(); + hvm_enable(&vmx_function_table); return 1; } diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h index b5ca99f84b..210ebe1164 100644 --- a/xen/include/asm-x86/hvm/hvm.h +++ b/xen/include/asm-x86/hvm/hvm.h @@ -146,8 +146,7 @@ extern struct hvm_function_table hvm_funcs; static inline void hvm_disable(void) { - if ( hvm_funcs.disable ) - hvm_funcs.disable(); + hvm_funcs.disable(); } int hvm_domain_initialise(struct domain *d); @@ -225,9 +224,7 @@ void hvm_hypercall_page_initialise(struct domain *d, static inline unsigned long hvm_get_guest_ctrl_reg(struct vcpu *v, unsigned int num) { - if ( hvm_funcs.get_guest_ctrl_reg ) - return hvm_funcs.get_guest_ctrl_reg(v, num); - return 0; /* force to fail */ + return hvm_funcs.get_guest_ctrl_reg(v, num); } static inline unsigned long diff --git a/xen/include/asm-x86/hvm/support.h b/xen/include/asm-x86/hvm/support.h index 6fe753458c..4a3b14afe5 100644 --- a/xen/include/asm-x86/hvm/support.h +++ b/xen/include/asm-x86/hvm/support.h @@ -260,7 +260,7 @@ int hvm_load(struct domain *d, hvm_domain_context_t *h); extern char hvm_io_bitmap[]; extern int hvm_enabled; -void hvm_enable(void); +void hvm_enable(struct hvm_function_table *); int hvm_copy_to_guest_phys(paddr_t paddr, void *buf, int size); int hvm_copy_from_guest_phys(void *buf, paddr_t paddr, int size); -- 2.30.2